package com.itheima.service.Impl;

import com.itheima.common.utils.POIUtils;
import com.itheima.mapper.OrderSettingMapper;
import com.itheima.pojo.OrderSetting;
import com.itheima.pojo.dto.OrderSettingDTO;
import com.itheima.pojo.vo.OrderSettingVO;
import com.itheima.service.OrderSettingService;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

@Service
public class OrderSettingImpl implements OrderSettingService {
	@Autowired
	private OrderSettingMapper orderSettingMapper;

	@Override
	public void download(HttpServletResponse response, String filename) {
		response.setContentType("application/vnd.ms-excel");
		response.setHeader("Content-Disposition", "attachment;filename=" + filename);
		try {
			InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("templates/" + filename);
			XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
			ServletOutputStream outputStream = response.getOutputStream();
			workbook.write(outputStream);

			workbook.close();
			outputStream.close();

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	@Override
	public Integer editNumberByOrderDate(OrderSettingDTO orderSettingDTO) {
		//查询当前日期是否设置预约人数
		OrderSetting orderSetting = orderSettingMapper.getByOrederDate(orderSettingDTO.getOrderDate());
		Integer recordCount = 0;
		if (orderSetting != null) {
			//之前设置过，更新预约人数
			recordCount = orderSettingMapper.editNumberByOrderDate(orderSettingDTO);

		} else {
			//没有设置过，新增预约人数
			recordCount = orderSettingMapper.add(orderSettingDTO);
		}
		return recordCount;
	}

	@Override
	public List<OrderSettingVO> getOrderSettingByMonth(String month) {
		// 解析传入的月份字符串，获取年份和月份
		String[] date = month.split("-");
		// 根据年份和月份构建该月份的第一天作为查询的开始日期
		LocalDate begin = LocalDate.of(Integer.valueOf(date[0]), Integer.valueOf(date[1]), LocalDate.MIN.getDayOfMonth());
		// 根据开始日期计算该月份的最后一天作为查询的结束日期
		LocalDate end = begin.plusDays(begin.lengthOfMonth() - 1);
		// 调用数据访问层方法，获取指定月份内的所有预约设置数据
		List<OrderSetting> orderSettingList = orderSettingMapper.getOrderSettingByMonth(begin, end);
		// 创建一个OrderSettingVO列表，用于存储转换后的预约设置视图对象
		List<OrderSettingVO> orderSettingVOList = new ArrayList<>();

		// 遍历预约设置列表，将每个预约设置对象转换为视图对象
		for (OrderSetting orderSetting : orderSettingList) {
			OrderSettingVO orderSettingVO = new OrderSettingVO();
			// 设置预约数量
			orderSettingVO.setNumber(orderSetting.getNumber());
			// 设置已预约数量
			orderSettingVO.setReservations(orderSetting.getReservations());
			// 使用Calendar处理预约日期，提取出月份中的天
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(orderSetting.getOrderDate());
			orderSettingVO.setDate(calendar.get(Calendar.DAY_OF_MONTH));

			// 将转换后的视图对象添加到列表中
			orderSettingVOList.add(orderSettingVO);
		}
		// 返回转换后的预约设置视图对象列表
		return orderSettingVOList;
	}

	/**
	 * 上传并处理Excel文件
	 * <p>
	 * 该方法首先验证上传的文件是否符合规范，然后读取Excel文件中的数据，
	 * 并根据读取的数据更新系统中的订单设置信息
	 *
	 * @param file 用户上传的包含订单设置信息的Excel文件
	 * @return 成功更新的订单设置记录数
	 * @throws IOException 如果在读取Excel文件过程中发生I/O错误
	 */
	@Override
	public Integer upload(MultipartFile file) throws IOException {
		// 验证上传的文件是否符合规范
		POIUtils.checkFile(file);
		// 创建日期格式化器，用于解析Excel中的日期字符串
		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");

		// 读取Excel文件中的数据
		List<String[]> excelData = POIUtils.readExcel(file);
		// 初始化成功更新的记录计数器
		Integer recordCount = 0;

		// 遍历Excel数据，每行数据创建一个OrderSettingDTO对象，并调用editNumberByOrderDate方法更新数据库
		for (String[] row : excelData) {
			OrderSettingDTO orderSettingDTO = new OrderSettingDTO();
			// 设置订单日期
			orderSettingDTO.setOrderDate(LocalDate.parse(row[0], formatter));
			// 设置订单数量
			orderSettingDTO.setNumber(Integer.valueOf(row[1]));

			// 更新数据库中的订单设置信息，并累加更新的记录数
			recordCount += editNumberByOrderDate(orderSettingDTO);
		}
		// 返回成功更新的记录总数
		return recordCount;
	}
}

